package com.example.config;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.io.File;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        // 1. 数据库连接配置（替换为你的数据库信息）
        String url = "jdbc:mysql://localhost:3306/busr?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
        String username = "root";
        String password = "123456";

        // 2. 代码生成路径（替换为你的项目 src/main/java 路径）
        String projectPath = System.getProperty("user.dir");
        String outputDir = projectPath + "/src/main/java";
        //3.文件生成路径
        String templatesDir=projectPath+"/src/main/resources/templates";

        // 3. 执行生成逻辑
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {// 全局配置
                    builder.author("Lin&xwj") // 作者名
                            .outputDir(outputDir) // 代码输出目录
                            .disableOpenDir() // 生成后不自动打开文件夹
                            .commentDate("yyyy-MM-dd"); // 注释日期格式
                })
                .packageConfig(builder -> {// 包配置（生成的代码放在哪个包下）
                    builder.parent("com") // 父包名（替换为你的项目父包）
                            .moduleName("example") // 模块名（可选，如“user”“order”）
                            .entity("entity") // 实体类包名
                            .mapper("mapper") // Mapper 接口包名
                            .service("service") // Service 接口包名
                            .serviceImpl("service.impl") // Service 实现类包名
                            .controller("controller") // Controller 包名
                            .xml("mapper.xml") // Mapper XML 文件路径（放在 resources 下）
                            .pathInfo(Collections.singletonMap(OutputFile.xml,
                            projectPath + "/src/main/resources/mapper/xml")); // XML 输出目录
                })
                .strategyConfig(builder -> {// 策略配置（针对数据库表的规则）
                    // 要生成的数据库表名（多个表用逗号分隔，如 "user,order"）
                    builder.addInclude("bus","bus_route","driver","reservation","ride_record","teacher")
                            // 表前缀（若表名有前缀，如“t_user”，则设置 prefix 为“t_”，生成的实体类名会去掉前缀）
                            .addTablePrefix("t_")
                            // 实体类策略
                            .entityBuilder()
                            .enableLombok()// 开启 Lombok 注解（实体类加 @Data）
                            .enableTableFieldAnnotation() // 实体类字段加 @TableField 注解
                            .idType(IdType.AUTO) // 主键生成策略（AUTO=自增，INPUT=手动输入等）
                            // Controller 策略（可选，生成 RestController）
                            .controllerBuilder()
                            .mapperBuilder()
                            .enableMapperAnnotation();
//                            .enableRestStyle() // 开启 RestController（@?RestController）
//                            .enableHyphenStyle(); // URL 路径用连字符（如 /user-info 代替 /userInfo）
                })// 新增：创建空的templates文件夹
                .injectionConfig(consumer -> {
                    // 手动创建templates目录（如果不存在）
                    File dir = new File(templatesDir);
                    if (!dir.exists()) {
                        dir.mkdirs(); // 递归创建目录（包括父目录）
                    }
                })
                .templateEngine(new VelocityTemplateEngine())//模板引擎（默认 Velocity）
                .execute();// 执行生成
    }
}